import numpy as np
import tensorflow as tf

# 先生成测试数据
# a = [[2, 3], [4, 5]]
# a = tf.convert_to_tensor(a, dtype=tf.float32)

'''
tf.  类型转换
'''
# 强制tensor转换为该数据类型
# tf.cast(张量名,dtype=数据类型)
# print(a)
# b = tf.cast(a, dtype=tf.int64)
# print(b)

'''
tf.reduce_min
tf.reduce_max
tf.reduce_mean
'''
# 计算张量纬度上的元素的最小值
# tf.reduce_min(张量名) max同理
# b = tf.reduce_min(a)
# print(b)


# 理解axis
# axis = 0 是纵向操作 axis = 1 是横向操作
# 不指定axis是对所有的值进行操作
# b = tf.reduce_mean(a, axis=0)
# c = tf.reduce_mean(a, axis=1)
# d = tf.reduce_mean(a)
# print(b)
# print(c)
# print(d)

'''
tf.variable 变量
'''
# variable
# tf.variable()将变量标记为"可训练" 被标记的变量会在反向传播中记录梯度信息
# 神经网络训练中,常用该函数标记待训练参数
# tf.Variable(初始值)
# w = tf.Variable([2, 3])
# print(w)

'''
tf.add
tf.subtract
tf.multiply
tf.divide
tf.square
tf.pow
tf.sqrt
'''
# 运算
# 对应元素的四则运算  只有纬度相同的张量才能进行四则运算
# tf.add tf.subtract tf.multiply tf.divide
# 平方 tf.square 次方 tf.pow 开方 tf.sqrt
# 矩阵乘 tf.matmul

'''
tf.data.Dataset.from_tensor_slices
'''
# 配对 tf.data.Dateset.from_tensor_slices
# 切分入张量的第一纬度,生成输入特征/标签对 构建数据集
# numpy格式和tensor格式都适用
# data = tf.data.Dataset.from_tensor_slices((输入特征,标签))
# features = tf.constant([12, 23, 10, 17])
# labels = tf.constant([0, 1, 0, 1])
# dataset = tf.data.Dataset.from_tensor_slices((features, labels))
# print(dataset)
# for element in dataset:
#     print(element)

# with 结构记录计算过程 gradient求出张量的梯度
# with tf.GradientTape() as tape:
#     若干个计算过程
#     grad = tape.gradient(函数,对谁求导)
# with tf.GradientTape() as tape:
#     w = tf.Variable(tf.constant(3, dtype=tf.float32))
#     loss = tf.pow(w, 2)
#     grad = tape.gradient(loss, w)
# print(grad)


# 枚举 enumerate
# enumerate 是python的内建函数 他可以遍历每个元素(如列表,元组或者字符串)
# 组合为:索引 元素 常在for循环中使用
# enumerate(列表明)
# seq = ['one', 'two', 'three']
# for i, enum in enumerate(seq):
#     print(i, enum)
# 运行结果
# 0 one
# 1 two
# 2 three

# 独热 (ont-hot encoding)
# 在分类问题中 ,常用独热码做标签
# 标记类型 1表示是 0表示非
# (0狗尾草鸢尾花 1杂色鸢尾花 2佛吉亚鸢尾花)
# 标签 : 1
# 独热 : (0. 1. 0.)
# tf.one_hot() 函数将待转数据,转换成one-hot形式的数据输出
# tf.one_hot(待转换数据,depth=几分类)
# classes = 3
# labels = tf.constant([1, 2, 0, 1, 0])
# output = tf.one_hot(labels, classes)
# print(output)


# tf.nn.softmax
# 当n分类的n个输出(y0,y1,y2...yn-1)通过softmax()函数 便符合概率分布了
# y = tf.constant([1.2, 2.1, -0.7])
# y_pro = tf.nn.softmax(y)
# print(y_pro)

# assign_sub
# 赋值操作 , 更新参数的值并返回
# 调用assign_sub前 先用variable定义变量w为可训练(可自更新)
# w.assign_sub(w要自减的内容)
# w = tf.Variable(5)
# w.assign_sub(1)
# print(w)

# argmax
# 返回张量沿指定纬度最大值的索引
# tf.argmax(张量名,axis=操作轴)
# a = np.array([[1, 2, 3], [4, 10, 6], [7, 8, 9]])
# b = tf.argmax(a, axis=0)
# print(b)


